package com.zykj.java8.lambda;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * @author zhoulj(周利军) [1217102780@qq.com]
 * @Title: FuncationDemo
 * @Project: ${MODEL_NAME}
 * @Module ID:   <(模块)类编号，可以引用系统设计中的类编号>
 * @Comments: < 使用 Lambda 表达式 和 函数接口>
 * @JDK version used:      <JDK1.8> 20
 * @since 2018/12/21-16:20
 */
public class FuncationDemo {

    public static void main(String[] args) {
        List<String>  strList = Arrays.asList("Java", "c", "Bean", "Demo", "Eavalute");
        // 这样直接定义lambda 表达式有问题
//        Predicate p1 = (String s) -> s.startsWith("J");

        List<String> list = cusomFilter(strList, (str) -> str.startsWith("J"));
        list.stream().forEach(System.out::println);

        Predicate<String> p1 = (s) -> s.toString().startsWith("B");


        cusomFilter(strList, p1).stream().forEach(System.out::println);

        //TODO  带 泛型的  Predicate d断言
        System.out.println("带 泛型的  Predicate d断言");
        Predicate<String> p2 = s -> s.length()>2;
        cusomFilter(strList, p2).stream().forEach(System.out::println);


        // lambda 使用高阶函数
        // 先定义一个 lambda 表达式
        System.out.println("lambda 使用高阶函数  filter>>>>>>>>>>>");
        List<String> resultList = new ArrayList<>();
        Predicate<String> gjfun1 = str -> str.length()>2;
        strList.stream().filter(gjfun1).collect(Collectors.toList()).forEach(System.out::println);

        System.out.println("lambda 复杂的Predicate 使用,    gjfun1  和 p1 进行并用  filter>>>>>>>>>>>");
        //复杂的Predicate 使用,    gjfun1  和 p1 进行并用
        strList.stream().filter(gjfun1.and(p1)).collect(Collectors.toList()).forEach(System.out::println);

    }

    private static List<String> cusomFilter(List<String> strList, Predicate<String> predicate) {
        // 这里不适用 stream 方式 循环， 要不然就可以直接用  filter 高阶函数了
        List<String> list = new ArrayList<>();
        for (String s : strList) {
            if (predicate.test(s)) {
                list.add(s);
            }
        }

        return list;
    }
}
